﻿/*======================================================================
== Copyright : BlueCurve (c)
== Licence   : Gnu/GPL v2.x
== Author    : Teddy Albina
== Email     : bluecurveteam@gmail.com
== Web site  : http://www.codeplex.com/BlueCurve
========================================================================*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using BlueCurve.IRemoteOperations;

namespace BlueCurveRepository.Remoting
{
    /// <summary>
    /// Serveur WCF
    /// </summary>
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
    public class Tcpservice : IRepository
    {
        #region 'Events'

        /// <summary>
        /// Données pour les evenements
        /// </summary>
        public class EventData : EventArgs
        {
            /// <summary>
            /// Chemin d'accès du fichier
            /// </summary>
            public string path { get; set; }
            /// <summary>
            /// Type de fichier
            /// </summary>
            public string typeoffile { get; set; }
            /// <summary>
            /// Nombre maximal de fichier à
            /// sélectionner
            /// </summary>
            public int max { get; set; }
        }

        /// <summary>
        /// Evenement déclenché sur l'ajout d'un fichier
        /// </summary>
        public delegate void EventAddFile(object sender, EventData e);
        public static event EventAddFile AddFileToCache;

        /// <summary>
        /// Evenement déclenché sur l'ajout d'un fichier dans le scheduler
        /// </summary>
        public delegate void EventAddFileToSchedule(object sender, EventData e);
        public static event EventAddFileToSchedule AddFileToScheduleCache;

        /// <summary>
        /// Evenement déclenché sur ajout d'un fichier comme étant parsable
        /// </summary>
        public delegate void EventAddParsableFile(object sender, EventData e);
        public static event EventAddParsableFile AddParsableFileToDatabase;

        /// <summary>
        /// Evenement déclenché sur la supression d'un fichier
        /// </summary>
        public delegate void EventDeleteFile(object sender, EventData e);
        public static event EventDeleteFile DeleteFileFromCache;

        /// <summary>
        /// Evenement déclenché sur la demande d'un fichier à indexer
        /// </summary>
        /// <returns>string</returns>
        public delegate string EventGetFileToIndex(object sender, EventArgs e);
        public static event EventGetFileToIndex GetFilesToIndex;

        /// <summary>
        /// Evenement déclenché sur la demande d'un fichier à parser
        /// </summary>
        /// <returns>string</returns>
        public delegate string EventGetFileToParse(object sender, EventArgs e);
        public static event EventGetFileToParse GetFilesToParse;

        /// <summary>
        /// Evenement déclenché sur la demande d'un fichier à parser pour le scheduler
        /// </summary>
        /// <returns>string</returns>
        public delegate string EventGetFileToSchedule(object sender, EventArgs e);
        public static event EventGetFileToSchedule GetFilesToSchedule;

        /// <summary>
        /// Evenement déclenché sur la demande d'une liste de fichiers à indexer
        /// </summary>
        /// <returns><![CDATA[List<string>]]></returns>
        public delegate List<string> EventGetListFilesToIndex(object sender, EventData e);
        public static event EventGetListFilesToIndex GetNewListFilesToIndex;

        /// <summary>
        /// Evenement déclenché sur la demande d'une liste de fichiers à parser
        /// </summary>
        /// <returns><![CDATA[List<string>]]></returns>
        public delegate List<string> EventGetListFilesToParse(object sender, EventData e);
        public static event EventGetListFilesToParse GetNewListFilesToParse;

        /// <summary>
        /// Evenement déclenché sur la demande de redemarrage de l'application
        /// </summary>
        public static event EventHandler _RestartApplication;
        /// <summary>
        /// Evenement déclenché sur la demande d'arrêt de l'application
        /// 
        /// </summary>
        public static event EventHandler _StopApplication;

        #endregion


        #region IRepository Membres

        /// <summary>
        /// Ajoute un fichier dans le cache
        /// </summary>
        /// <param name="path">Chemin d'accès du fichier</param>
        /// <param name="typeoffile">Type mime du fichier</param>
        [OperationBehavior]
        public void AddFile(string path, string typeoffile)
        {
            if (!string.IsNullOrEmpty(path) && !string.IsNullOrEmpty(typeoffile) && AddFileToCache != null)
            {
                AddFileToCache("", new EventData() { path = path, typeoffile = typeoffile });
            }
        }

        /// <summary>
        /// Ajoute un nouveau type de fichier à parser
        /// </summary>
        /// <param name="typeoffile">Type mime du fichier</param>
        [OperationBehavior]
        public void AddParsableFile(string typeoffile)
        {
            if (!string.IsNullOrEmpty(typeoffile) && AddParsableFileToDatabase != null)
            {
                AddParsableFileToDatabase("", new EventData() { typeoffile = typeoffile });
            }
        }

        /// <summary>
        /// Ajoute un nouveau fichier pour le scheduler
        /// </summary>
        /// <param name="path">Chemin d'accès du fichier<</param>
        [OperationBehavior]
        public void AddFileToSchedule(string path)
        {
            if (!string.IsNullOrEmpty(path) && AddFileToScheduleCache != null)
            {
                AddFileToScheduleCache("", new EventData() { path = path });
            }
        }

        /// <summary>
        /// Supprime un fichier du cache
        /// </summary>
        /// <param name="path">Chemin d'accès du fichier</param>
        [OperationBehavior]
        public void DeleteFile(string path)
        {
            if (!string.IsNullOrEmpty(path) && DeleteFileFromCache != null)
            {
                DeleteFileFromCache("", new EventData() { path = path });
            }
        }

        /// <summary>
        /// Obtiens un fichier à indexer
        /// </summary>
        /// <returns>Chemin d'accès du fichier</returns>
        [OperationBehavior]
        public string GetFileToIndex()
        {
            try
            {
                return GetFilesToIndex("", EventArgs.Empty);
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// Obtiens un fichier à parser
        /// </summary>
        /// <returns>Chemin d'accès du fichier</returns>
        [OperationBehavior]
        public string GetFileToParse()
        {
            try
            {
                return GetFilesToParse("", EventArgs.Empty);;
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// Obtiens un chemin de fichier à monter dans le repository
        /// </summary>
        /// <returns>Chemin d'accès du fichier</returns>
        [OperationBehavior]
        public string GetFileToSchedule()
        {
            try
            {
                return GetFilesToSchedule("", EventArgs.Empty);
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// Obtiens une liste de fichiers à indexer
        /// </summary>
        /// <param name="n">Nombre de chemin de fichier à retourner</param>
        /// <returns><![CDATA[List<string>]]> liste de chemin de fichier</returns>
        [OperationBehavior]
        public List<string> GetListFilesToIndex(int n)
        {
            try
            {
                return GetNewListFilesToIndex("", new EventData() { max = n });
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return null;
            }
        }

        /// <summary>
        /// Obtiens une liste de fichiers à parser
        /// </summary>
        /// <param name="n">Nombre de chemin de fichier à retourner</param>
        /// <returns><![CDATA[List<string>]]> liste de chemin de fichier</returns>
        [OperationBehavior]
        public List<string> GetListFilesToParse(int n)
        {
            try
            {
                return GetNewListFilesToParse("", new EventData() { max = n });
            }
            catch
            {
                return null;
            }
        }

        #endregion




        #region IRemoteOperationsBase Membres

        /// <summary>
        /// Redemarre l'application
        /// </summary>
        [OperationBehavior]
        public void RestartApplication()
        {
            _RestartApplication("", EventArgs.Empty);
        }

        /// <summary>
        /// Arrete l'application
        /// </summary>
        [OperationBehavior]
        public void StopApplication()
        {
            _StopApplication("", EventArgs.Empty);
        }

        #endregion
    }
}
